#
# Main makefile
#



CROSS		= powerpc-gekko-

export CC		:=	$(CROSS)gcc
export CXX		:=	$(CROSS)g++
export AR		:=	$(CROSS)ar
export OBJCOPY	:=	$(CROSS)objcopy
export AS		:=	$(CROSS)as
export LD		:=	$(CXX)
CFLAGS_LOCAL=
DOLTOOL=doltool





# Configuration
CFLAGS =	-Wall $(CFLAGS_LOCAL) -I. -Ilwip/include \
			-DGEKKO -mcpu=750 -meabi -mhard-float -DFPM_PPC -DOPT_ACCURACY \
			-Iinclude -Imad -Ilwip/arch/gc/include -I./lwip/include/ipv4  \
			-Os -O2 -fno-exceptions -nostdinc -DNDEBUG -DPSO

AFLAGS	=	-Iinclude
LDFLAGS =	-DGEKKO -mcpu=750 -meabi -mhard-float -nostdlib

#-DLWIP_DEBUG -O2 
#-Werror

# Files
MAIN_OBJS = \
	main.o

LIBMAD_OBJS = \
	mad/bit.o mad/fixed.o mad/frame.o mad/huffman.o mad/layer3.o \
	mad/stream.o mad/synth.o mad/timer.o mad/version.o

ZLIB_OBJS = \
	zlib/adler32.o zlib/compress.o zlib/crc32.o zlib/deflate.o \
	zlib/infback.o zlib/inffast.o zlib/inflate.o zlib/inftrees.o \
	zlib/trees.o zlib/uncompr.o zlib/zutil.o

IO_OBJS = \
	io/video.o io/console.o io/vsprintf.o \
	io/exi.o io/dvd.o  io/network.o io/sram.o io/pad.o io/console_font_8x8.o \
	io/console_font.o io/Card.o

DISK_OBJS = \
	disk/sd.o disk/fat.o disk/file.o
	
IPL_OBJS = \
	ipl/ipl.o ipl/font.o

LOWLEVEL_OBJS = \
	lowlevel/cache.o lowlevel/exception.o lowlevel/exceptionc.o \
	lowlevel/irq.o lowlevel/string_asm.o lowlevel/string.o \
	lowlevel/ctype.o lowlevel/time.o lowlevel/fakemalloc.o lowlevel/GC_Time.o

LOAD_OBJS = \
	load/elf.o load/dol.o load/dolup.o load/netload.o \
	load/iso9660qoob.o
	
DVD_OBJS = \
	 dvd/anaconda.o dvd/GC_Dvd.o load/loadapp.o dvd/drivesetup.o

LWIP_OBJS = \
	lwip/core/tcp_in.o \
	lwip/core/inet.o lwip/core/mem.o lwip/core/memp.o \
	lwip/core/netif.o lwip/core/pbuf.o lwip/core/raw.o  lwip/core/stats.o \
	lwip/core/sys.o lwip/core/tcp.o lwip/core/ipv4/ip_addr.o \
	lwip/core/ipv4/icmp.o lwip/core/ipv4/ip.o lwip/core/ipv4/ip_frag.o \
	lwip/core/tcp_out.o lwip/core/udp.o lwip/netif/etharp.o \
	./lwip/arch/gc/lib.o   ./lwip/arch/gc/netif/gcif.o \
	./lwip/arch/gc/lib_arch.o \

#lwip/core/dhcp.o 

HTTPD_OBJS = \
	httpd/vfs.o httpd/httpd.o
	
MENU_OBJS = menu/menu.o menu/draw.o

LIBRARIES =
# gdbstub/libgdbstub.a

# ./lwip/core/dhcp.o 

OBJS = lowlevel/crt0.o $(IO_OBJS) $(MAIN_OBJS) $(IPL_OBJS)\
			 $(LIBMAD_OBJS) $(LOWLEVEL_OBJS) $(LIBRARIES) $(DVD_OBJS)\
			 $(LOAD_OBJS) $(LWIP_OBJS) $(HTTPD_OBJS) $(MENU_OBJS) \
		   #$(DISK_OBJS) $(ZLIB_OBJS)
# Build rules
all: main.dol main_boot.bin

clean:
	rm -rf $(OBJS)
	
realclean:
	find -name '*.o' | xargs -r rm
	find -name '*.a' | xargs -r rm
	find -name '*~' | xargs -r rm
	find -name '*.bin' | xargs -r rm
	find -name '*.dol' | xargs -r rm
	find -name '*.elf' | xargs -r rm
	find -name '*.map' | xargs -r rm
	find -name '*.tmp' | xargs -r rm


.c.o:
	$(CC) $(CFLAGS)  -c -o $@ $*.c

.cpp.o:
	$(CXX) $(CFLAGS) -c -o $@ $*.cpp

.s.o:
	$(CC) $(AFLAGS) -c -o $@ $*.s

.S.o:
	$(CC) $(AFLAGS) -c -o $@ $*.S



main.dol: main.elf
	$(DOLTOOL) -d main.elf

main.bin: main.elf
	$(OBJCOPY) -O binary $< $@

main_boot.bin: main_boot.elf
	$(OBJCOPY) -O binary $< $@

main.elf: $(OBJS)
	$(CC) $(LDFLAGS) -Wl,-n -o $@ -Wl,-Ttext=0x80d00000 $(OBJS) libm.a -lm -L. -Wl,-Map -Wl,main.map
#	$(CC) $(LDFLAGS) -Wl,-n -o $@ -Wl,-Ttext=0x81300000 $(OBJS) -Wl,-Map -Wl,main.map
	#$(CC) $(LDFLAGS) -Wl,-n -o main_high.elf -Wl,-Ttext=0x81300000 $(OBJS) libm.a -lm -L. -Wl,-Map -Wl,main_high.map

main_boot.elf: $(OBJS)
	$(CC) $(LDFLAGS) -Wl,-n -o $@ -Wl,-Tbootipl.lds $(OBJS) libm.a -lm -L. -Wl,-Map -Wl,main_boot.map


gdbstub/libgdbstub.a:
	$(MAKE) -C gdbstub

# TODO: dependencies
